/**
 * 
 */
package cn.biplam.common.bean.tree;

import java.io.Serializable;
import java.util.ArrayList;

import cn.biplam.common.bean.Bean;
import cn.biplam.common.client.DbResource;
import cn.biplam.common.client.OperatorResult;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * 索引表扩展操作
 * @author 	WangSong 2009-11-25 上午09:46:33
 * @version 1.0
 */
public abstract class IndexTableExt extends Bean implements Serializable{
	
	protected String tableName;
	/**
	 * 当前节点的下级节点是否有下级,<Font color=red>注意：穿透一层</Font><BR>
	 * 用于删除下级节点是固定节点的节点时判断下级节点是否有内容
	 * @param nodeId	当前节点ID
	 * @return OperatorResult.getBooleanValue()
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult childHaveChild(String nodeId) throws ErrorMessage;
	
	 /**  
	 * 向上查找两个节点之间的路径(起点)
	 * @param startNode 起始节点
	 * @param endNode   终止节点
	 * @return  终止节点为空时返回起始节点到根节点的路径<BR>
	 * 		   当起始节点或者终止节点不存在时:返回NULL<BR>
	 *         起始节点和终止节点间不存在路径时:返回null<BR>
	 *         终止节点开始到起始节点间起始节点的所有父亲(包含终止节点)<BR>
	 */
	public abstract ArrayList<String> findPath(String startNode, String endNode) throws ErrorMessage;
	
	/**
	 * 从另一个索引表复制一个节点,包括上级<BR>
	 * 注意:如果上级节点存在,则略过该节点的插入
	 * @param srcTableName
	 * @param srcNodeId
	 * @param parentNodeId
	 * @param includeSubNode
	 * @param getSql
	 * @return OperatorResult
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult copyNode(String srcTableName,String srcNodeId,
			String parentNodeId,boolean includeSubNode,boolean getSql) throws ErrorMessage;
	
	/**
	 *  删除节点及其所有儿子<BR>
	 *  <font COLOR='red'>适用于儿子节点个数不是很多的情况(儿子节点ID的字符串总长度不超过1000)</font>
	 * @param nodeId 节点ID
	 * @param getSql 是否返回SQL
	 * @return getSql:true  删除所有下级节点的SQL<BR>
	 *         getSql:false 删除是否成功<BR>
	 * @throws ErrorMessage
	 */
	public abstract OperatorResult delAllChildren(String nodeId,boolean getSql) throws ErrorMessage;
	
	/**
	 *  获取下级节点列表<BR>可用于sql in子句的列表('a','b')
	 * @param nodeId 节点ID
	 * @return 返回下级节点的列表(逗号分隔)<BR>
	 * @throws ErrorMessage
	 */
	public abstract  String getChildrenList(String nodeId) throws ErrorMessage;
	
	/**
	 *  获取下级节点列表<BR>可用于sql in子句的列表('a','b')
	 * @param nodeId 节点ID
	 * @param dbResource 数据源(可以为空,如果为空连接到默认数据源)
	 * @param filterValues 字符类型过滤条件 (Key:字段名;Value:字段值)
	 * @return 返回下级节点的列表(逗号分隔)<BR>
	 * @throws ErrorMessage
	 */
	public abstract  String getChildrenList(String nodeId,DbResource dbResource, 
			KvMap<String, String> filterValues) throws ErrorMessage;
	
	/**
	 *  获取下级节点列表<BR>
	 * @param nodeId 节点ID
	 * @param dbResource 数据源(可以为空,如果为空连接到默认数据源)
	 * @param filterValues 字符类型过滤条件 (Key:字段名;Value:字段值)仅返回匹配记录
	 * @return  返回下级节点的列表
	 */
	public abstract ArrayList<String> getChilds(String nodeId,
			DbResource dbResource,
			KvMap<String, String> filterValues) throws ErrorMessage;
	

	/**
	 * 获取下级节点业务代码列表<BR>可用于sql in子句的列表('a','b')
	 * @param nodeId 节点ID
	 * @param dbResource 数据源(可以为空,如果为空连接到默认数据源)
	 * @param filterValues 字符类型过滤条件 (Key:字段名;Value:字段值) 仅返回匹配记录
	 * @return 返回下级节点的列表(逗号分隔)<BR>
	 * @throws ErrorMessage
	 */
	public abstract String getChildrenCodeList(String nodeId, DbResource dbResource,
			KvMap<String, String> filterValues) throws ErrorMessage;

	/**
	 * 获取实例
	 * @param userId		用户ID
	 * @param tableName		操作的索引表名称(系统模型索引表名称@see MdParam.Table_Name)
	 * @return	IndexTableExt
	 * @throws ErrorMessage
	 */
	public static IndexTableExt getNewInstance(String userId,String tableName) throws ErrorMessage{
		return (IndexTableExt) get(IndexTableExt.class.getSimpleName(), userId,tableName);
	}
}
